unit UBaseModelo;

interface

type
  IObservavel = interface;

  IObservado = interface
  ['{53473ED6-EC77-411F-A34D-CD7E63685F4A}']
    procedure Atualizar(Observavel: IObservavel);
  end;

  IObservavel = interface
    ['{017EE503-28D8-44F6-BB2E-641C875A4AA8}']
    procedure Ataque(Observado: IObservado);
    procedure Desataque(Observado: IObservado);
    procedure Notificacao;
  end;

  TBaseObjeto = class;

  IControle = interface
    ['{C63C9C78-AE51-4D2B-8DF3-4555DEB3BD16}']
    procedure Salvar;
    function Encontrar(ID: String): TBaseObjeto;
    function Novo: TBaseObjeto;
  end;

  TBaseObjeto = class(TInterfacedObject, IObservavel)
    private
      FObservados: TInterfaceList;
      FID: String;

      procedure SetID(const Value: String);
    protected

    public
      constructor Create;
      destructor Destroy; override;
      procedure Ataque(Observado: IObservado);
      procedure Desataque(Observado: IObservado);
      procedure Notificacao;
    published
      property ID: String read FID write SetID;
  end;
  
implementation


// http://www.devmedia.com.br/artigo-clube-delphi-102-aplicacoes-win32-com-mvc/11760

end.
 